package store;

import org.jdom.Element;
import dataview.Frammenti;
import exceptions.XmlException;
import store.Frammento;

public class Passo {
	private Frammenti frammenti;
	
	public Passo() {
		frammenti = new Frammenti();
	}
	
	public Frammenti getFrammenti() {
		return frammenti;
	}
	
	public int indiceInizioFrammento(int n) {
		int s = 0;
		for (int i = 1; i <= n; i++)
			s += frammenti.get(i-1).toString().length();
		return s;
	}

	public int indiceFineFrammento(int n) {
		int s = 0;
		for (int i = 0; i <= n; i++)
			s += frammenti.get(i).toString().length();
		return s - (frammenti.get(n) instanceof RifRicetta || frammenti.get(n) instanceof RifIngrediente? 1 : 0);
	}
	
	public static Passo fromXml(Element passo, boolean check) throws XmlException {
		if (passo.getName() != "passo") throw new XmlException("L'elemento passato come parametro non rappresenta un passo");
		Passo p = new Passo();
		for (Object frammento : passo.getChildren())
			p.frammenti.add(Frammento.fromXml((Element)frammento, check));
		return p;
	}
	
	public Element toXml() {
		Element passo = new Element("passo");
		for (Frammento frammento : frammenti)
			passo.addContent(frammento.toXml());
		return passo;
	}
	
	//TODO
//	public String vis() {}
	
	public void aggiungiFrammentoTesto(String testo) {
		frammenti.add(new Testo(testo));
	}
	
	public void aggiungiFrammentoIngrediente(double quantita, Cibo cibo) {
		frammenti.add(new RifIngrediente(quantita, cibo));
	}
	
	public void aggiungiFrammentoRicetta(int nPorzioni, Ricetta ricetta) {
		frammenti.add(new RifRicetta(nPorzioni, ricetta));
	}
	
	@Override
	public String toString() {
		String res = "";
		for (Frammento frammento : frammenti)
			res += frammento.toString();
		return res;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((frammenti == null) ? 0 : frammenti.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;
		if (obj == null) return false;
		if (getClass() != obj.getClass()) return false;
		Passo other = (Passo)obj;
		if (frammenti == null) {
			if (other.frammenti != null) return false;
		} else if (!frammenti.equals(other.frammenti)) return false;
		return true;
	}
}
